package service;

import java.io.*;
import java.nio.channels.FileLock;
import java.util.List;

public class WALMannager {

    private final WAL wal;
    // 文件路径
    private final String dirPath;
    // 文件读取锁 FileLock
    private final FileLock fileLock;

    // 构造器
    public WALMannager(WAL wal, String path, String dirPath, FileLock fileLock) {
        this.wal = wal;
        this.dirPath = dirPath;
        this.fileLock = fileLock;
    }

    // put方法
    public void put(String key, String value) {
        wal.getMap().put(key, value);
    }

    // get方法
    public String get(String key) {
        return wal.getMap().get(key);
    }

    // 获取当前的日志wal文件
    public List<File> getWALFiles() {
        File dir = new File(dirPath);
        if (!dir.exists()) {
            // 如果dirPath不存在，创建目录
            dir.mkdir();
        }
        // 返回dirPath下的所有文件
        return List.of(dir.listFiles());
    }

    // 写入put操作到日志文件
    public void write(String key, String value) throws IOException {
        // 获取当前的日志文件
        List<File> walFiles = getWALFiles();
        File file;

        // 如果当前的日志文件为空，创建一个新日志文件
        if (walFiles.isEmpty()) {
            file = new File(dirPath + "/wal_0.log");
        } else {
            // 获取最后一个日志文件
            File lastFile = walFiles.get(walFiles.size() - 1);
            // 如果最后一个日志文件的大小大于100KB，创建一个新日志文件
            if (lastFile.length() > 100 * 1024) {
                file = new File(dirPath + "/wal_" + walFiles.size() + ".log");
            } else {
                file = lastFile;
            }
        }

        // 写入put操作到WAL文件
        try (FileWriter fw = new FileWriter(file, true); BufferedWriter bw = new BufferedWriter(fw)) {
            // 将key和value写入文件，每条记录写一行
            bw.write("PUT " + key + " " + value);
            bw.newLine();
        }

        // 同时将key和value写入内存中的WAL map
        this.put(key, value);
    }

    // 读取WAL文件内容
    public void read() throws IOException {
        // 获取当前的WAL文件
        List<File> walFiles = getWALFiles();

        for (File file : walFiles) {
            try (FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr)) {
                String line;
                while ((line = br.readLine()) != null) {
                    // 假设每条记录的格式是 "PUT key value"
                    String[] parts = line.split(" ", 3);
                    if (parts.length == 3 && "PUT".equals(parts[0])) {
                        String key = parts[1];
                        String value = parts[2];
                        this.put(key, value);
                    }
                }
            }
        }
    }
}
